package com.zjl.redis.第04章_事务_管道_发布订阅;

import com.zjl.redis.第01章_redis安装.RedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

import java.util.List;

/**
 *
 * multi 开启事务
 *   之后的get  set操等对redis的作都保存起来
 *   先不执行     等到执行
 *   如果中间   有单词拼错  这个事务会强制停止
 *   但是      执行错误  如
 *   incr key //将key的value值+1  value必须为integer类型
 *   会跳过这个执行语句  其他依旧执行
 * exec //执行事务块命令      开始一条一条执行
 *
 * discard //停止事务   可以中断事务的执行
 *
 * watch key1 key2 //监视key1等键  在事务开启前执行
 *       如果  这些建在事务执行前如果改动
 *       exec 后会返回nil 也就是不执行
 * unwatch key1 key2 //取消监视
 *      实现了类似 java的CAS  比较并交换 乐观锁
 *
 * 数据库事务四大特性
 * 原子性 隔离性 完整性 一致性.ACID
 *
 */
public class A2_Redis事务操作 {
    public static void main(String[] args) throws InterruptedException {

        //我发现   监控并无卵用
        Jedis redis1 = RedisUtil.getRedisPool();
        Jedis redis2 = RedisUtil.getRedisPool();
        System.out.println(redis1.ping());
        Transaction transaction = redis1.multi();//开启事务
        transaction.watch("1","2");//监视事务
        transaction.set("1","1");//事务添加的语句
        transaction.set("2","2");//事务添加的语句
        //在执行事务时，不能用这个 连接 执行别的操作
        System.out.println("------中间进行了监控对象的操作------------");
        redis2.set("1","11");
        redis2.set("2","22");
        System.out.println(redis2.get("1"));
        System.out.println(redis2.get("2"));
        Thread.sleep(1000);

        System.out.println("-*------开始执行事务--------------");
        List<Object> exec = transaction.exec();//开始执行事务
        System.out.println(exec);
        System.out.println("-*-----------------------");
        System.out.println("新的值1：" + redis2.get("1"));
        System.out.println("新的值2：" + redis2.get("2"));

//        transaction.unwatch();//取消监视事务
//        transaction.discard();//中断事务
        redis1.close();//关闭
        redis2.close();//关闭

    }
}
